package com.cmz.common.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期操作工具
 * @author cmz
 */
public class DateUtils {

    private DateUtils() {}

    public static Date addMonth(Date date, int amount) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.MONTH, amount);
        return ca.getTime();
    }

    /**
     * 将 Date 对象时间部分置为 00:00:00.000
     * @param date 时间对象
     * @return 时分秒为 00:00:00.000 Date 对象
     */
    public static Date toBegining(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * 将 Date 对象时间部分置为 23:59:59.999
     * @param date 时间对象
     * @return 时分秒为 23:59:59.999 Date 对象
     */
    public static Date toEnding(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);

        return calendar.getTime();
    }

    /**
     * 获取系统日期 Date 对象
     * @return 当前日期（时分秒为 0）
     */
    public static Date getToday() {
        return toBegining(new Date(TimeUtils.getCurrentTimeMillis()));
    }

    /**
     * 获取系统日期时间 Date 对象
     * @return 具有时分秒的当前日期时间
     */
    public static Date getNow() {
        return new Date(TimeUtils.getCurrentTimeMillis());
    }

    /**
     * 保留时间到小时
     * @param date 源日期时间
     * @return 保留到分钟数的小时
     */
    public static Date truncateToHour(Date date) {
        return org.apache.commons.lang3.time.DateUtils.truncate(date, Calendar.HOUR);
    }

    /**
     * 保留时间到分钟
     * @param date 源日期时间
     * @return 保留到分钟数的时间
     */
    public static Date truncateToMinute(Date date) {
        return org.apache.commons.lang3.time.DateUtils.truncate(date, Calendar.MINUTE);
    }

    /**
     * 保留时间到秒
     * @param date 源日期时间
     * @return 保留到秒的时间
     */
    public static Date truncateToSecond(Date date) {
        return org.apache.commons.lang3.time.DateUtils.truncate(date, Calendar.SECOND);
    }

    /**
     * 格式化日期
     * @param date   日期
     * @param format 格式
     * @return 日期字符串
     */
    public static String format(Date date, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(date);
    }

    /**
     * 判断日期是否为同一天
     * @param date1 日期1
     * @param date2 日期2
     * @return 是否为同一天
     */
    public static boolean isSameDay(Date date1, Date date2) {
        return org.apache.commons.lang3.time.DateUtils.isSameDay(date1, date2);
    }

}
